#pragma once

#include <Runtime/Core/Core.h>
#include <Runtime/Resources/Mesh/Mesh.h>
#include <Runtime/Resources/Texture/TextureResource.h>
#include <Runtime/World/Camera.h>
#include <memory>


struct CBData {
	XMMATRIX World;
	XMMATRIX View;
	XMMATRIX Projection;
};

class GameObject {
public:
	GameObject();
	GameObject(const GameObject&) = delete;
	GameObject& operator=(const GameObject&) = delete;
	virtual ~GameObject() = default;
	virtual void UpdateMatrix();
	virtual void Update();

public:
	std::shared_ptr<Mesh> mMesh;
	std::shared_ptr<TextureResource> mBaseColor;
	std::shared_ptr<TextureResource> mEmissive;
	std::shared_ptr<TextureResource> mNormal;
	XMFLOAT3 mPosition = { 0.0f, 0.0f, 0.0f };
	XMFLOAT3 mRotation = { 0.0f, 0.0f, 0.0f };
	XMFLOAT3 mScale = { 1.0f, 1.0f, 1.0f };
	CBData mModelMatrix;
	std::shared_ptr<GraphicsBuffer> mGraphicsBuffer;
};

class Helmet : public GameObject {
public:
	Helmet();
	~Helmet() = default;
};

class Lantern : public GameObject {
public:
	Lantern();
	~Lantern() = default;
};
